package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ISaleUserDAO;
import org.jsola.hr.dto.SaleUserAddDTO;
import org.jsola.hr.dto.SaleUserUpdateDTO;
import org.jsola.hr.dto.permission.HrGroupAddDTO;
import org.jsola.hr.dto.permission.HrGroupUpdateDTO;
import org.jsola.hr.entity.SaleUserDO;
import org.jsola.hr.query.SaleUserQuery;
import org.jsola.hr.vo.HrGroupListVO;
import org.jsola.hr.vo.SaleUserListVO;
import org.jsola.hr.vo.SaleUserVO;
import org.jsola.permission.vo.GroupListVO;
import org.jsola.permission.vo.GroupVO;
import org.jsola.user.core.TokenUser;
import org.jsola.user.entity.UserDO;

import java.util.List;


/**
 * 销售人员
 *
 * @author zhr
 */
public interface ISaleUserService extends IService<ISaleUserDAO, SaleUserDO> {

    /**
     * 新增销售人员
     *
     * @param saleUserAddDTO 新增销售人员DTO
     * @param tokenUser      当前用户
     * @return 销售人员详情信息
     */
    SaleUserVO save(SaleUserAddDTO saleUserAddDTO, TokenUser tokenUser);

    /**
     * 修改销售人员
     *
     * @param saleUserUpdateDTO 修改销售人员DTO
     * @param tokenUser         当前用户
     * @return 更新数量
     */
    int update(SaleUserUpdateDTO saleUserUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除销售人员，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser   当前用户
     * @param saleUserIds 销售人员id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... saleUserIds);

    /**
     * 根据销售人员id查找
     *
     * @param saleUserId 销售人员id
     * @param siteId     所属站点id
     * @return 销售人员详情信息
     */
    SaleUserVO selectById(String saleUserId, String siteId);

    /**
     * 查询销售人员
     *
     * @param saleUserQuery 查询条件
     * @param siteId        所属站点id
     * @return 销售人员列表信息
     */
    List<SaleUserListVO> select(SaleUserQuery saleUserQuery, String siteId);

    /**
     * 查询销售人员记录数
     *
     * @param saleUserQuery 查询条件
     * @param siteId        所属站点id
     * @return 销售人员记录数
     */
    int selectCount(SaleUserQuery saleUserQuery, String siteId);

    /**
     * 分页查询销售人员
     *
     * @param saleUserQuery 查询条件
     * @param tokenUser     当前用户
     * @return 销售人员列表信息
     */
    Page<SaleUserListVO> selectPage(SaleUserQuery saleUserQuery, TokenUser tokenUser);


    /**
     * 根据销售人员id查找
     *
     * @param saleUserId 销售人员id
     * @param siteId     所属站点id
     * @return 销售人员
     */
    SaleUserDO selectDOById(String saleUserId, String siteId);

    /**
     * 查询销售人员
     *
     * @param saleUserQuery 查询条件
     * @param siteId        所属站点id
     * @return 销售人员列表
     */
    List<SaleUserDO> selectDO(SaleUserQuery saleUserQuery, String siteId);

    /**
     * 根据销售人员UserId列表查询销售
     *
     * @param saleUserIdList 销售人员UserId列表
     * @param tokenUser      当前用户
     * @return 销售列表
     */
    List<SaleUserDO> selectBySaleUserIdList(List<String> saleUserIdList, TokenUser tokenUser);

    /**
     * 查询分组组织树
     *
     * @param groupOrAdminName 组织名称或分组管理员名称
     * @param tokenUser        当前用户
     * @return 组织树
     */
    List<GroupListVO> selectGroupTree(String groupOrAdminName, TokenUser tokenUser);

    /**
     * 查询分组的分组管理员
     *
     * @param groupId 分组Id
     * @return 分组管理员
     */
    List<UserDO> selectAdminByGroupId(String groupId);

    /**
     * 分页查询对应销售组下的销售人员
     *
     * @param saleUserQuery 查询参数
     * @param tokenUser     当前用户
     * @return 销售人员
     */
    Page<SaleUserListVO> selectSaleByGroupId(SaleUserQuery saleUserQuery, TokenUser tokenUser);

    /**
     * 导出销售
     *
     * @param saleUserQuery 查询条件
     * @param tokenUser     当前用户
     * @return excel路径
     */
    String exportSale(SaleUserQuery saleUserQuery, TokenUser tokenUser);

    /**
     * 查询租户下所有销售
     *
     * @param tokenUser 当前用户
     * @return 租户下所有销售
     */
    List<SaleUserDO> selectSaleBySite(TokenUser tokenUser);

    /**
     * 根据userId查询销售
     *
     * @param userId    userId
     * @param tokenUser 当前用户
     * @return 销售
     */
    SaleUserDO selectByUserId(String userId, TokenUser tokenUser);

    /**
     * 新增分组
     *
     * @param hrGroupAddDTO 新增参数
     * @param tokenUser     当前用户
     * @return 新增结果
     */
    GroupVO saveGroup(HrGroupAddDTO hrGroupAddDTO, TokenUser tokenUser);

    /**
     * 修改分组
     *
     * @param hrGroupUpdateDTO 更新参数
     * @param tokenUser        当前用户
     */
    void updateGroup(HrGroupUpdateDTO hrGroupUpdateDTO, TokenUser tokenUser);

    /**
     * 删除分组
     *
     * @param groupId   更新参数
     * @param tokenUser 当前用户
     */
    void deleteGroup(String groupId, TokenUser tokenUser);

    /**
     * 返费概览页面默认选中分组Id
     *
     * @param tokenUser 当前用户
     * @return 分组Id
     */
    GroupListVO selectDefaultGroupId(TokenUser tokenUser);

    /**
     * 查询分组详情
     *
     * @param groupId   分组Id
     * @param tokenUser 当前用户
     * @return 分组详情
     */
    HrGroupListVO selectGroupInfo(String groupId, TokenUser tokenUser);

    void updatePhone(String userId, String phone);
}


